﻿//----------------------------------------------------------------
// Desc: 
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2012-05-26
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


class IFPass : public IFMemObject
{
protected:
    explicit IFPass()
        :fge(0)
        ,passSet(ePAS_ALL)
    {}

public:
    // 初始化
    virtual bool Initialize(){ return true; }
    // 测试此PASS是否可用
    virtual bool IsAvailable(){ return false; }
    // 释放
    virtual void Release(){}
    // 设备丢失时调用
    virtual void Lost(){}
    // 设备恢复时调用
    virtual void Reset(){}
    // 设置当前渲染手法（不是所有PASS都需要）
    virtual void SetTechnique(EF_SUBSET_DRAW_TYPE p){}
    // 开始渲染，提交GPU寄存器数据
    virtual void BeginPass(){ Commit(passSet); }
    // 绘制处理
    virtual void Draw() = 0;
    // 结束
    virtual void EndPass(){}
    // 设置用户数据
    virtual void SetUserData(DWORD_PTR d){ userDT = d; }
    // 获取用户数据
    virtual DWORD_PTR GetUserData(){ return userDT; }

    IFEngine* fge;          // 引擎对象
    DWORD_PTR userDT;       // 用户数据
    FProperty passSet;      // 自动提交属性设置

    // 提交GPU相关寄存器数据到渲染器，默认使用请填入passSet（EF_PASS_AUTO_SET）
    virtual void Commit(DWORD kvl);
    // 属性提交接口
    virtual void CommitMatrix(const ACHAR* name, FMATRIX* mat) = 0;         // matrix 4x4
    virtual void CommitVector(const ACHAR* name, float* v, size_t n) = 0;   // vector1 -> vector4
    virtual void CommitArray(const ACHAR* name, int* v, size_t n) = 0;      // int1 -> int4
    virtual void CommitFloat(const ACHAR* name, float f) = 0;               // float
    virtual void CommitInt(const ACHAR* name, int i) = 0;                   // int
};


class FPass_null : public IFPass
{
    FDECLARE_CLASS(FPass_null)

public:
    virtual void Draw(){}
    virtual void CommitMatrix(const ACHAR* name, FMATRIX* mat){}
    virtual void CommitVector(const ACHAR* name, float* v, size_t n){}
    virtual void CommitArray(const ACHAR* name, int* v, size_t n){}
    virtual void CommitFloat(const ACHAR* name, float f){}
    virtual void CommitInt(const ACHAR* name, int i){}
};